package git

import (
	"bufio"
	"fmt"
	"gopatch/global"
	"log"
	"os"
	"regexp"
	"strings"
	"sync"
)

// HandleArgs 处理运行时命令行参数
func HandleArgs() []GitVersionStruct {
	// 获取运行时参数
	args := os.Args[1:]
	if args == nil || len(args) == 0 {
		panic("参数异常")
	}

	var versions []string
	// 遍历参数判断处理方式
	for _, arg := range args {
		switch arg {
		case "-a":
			// 开启自动匹配
			global.AutoCompare = true
			break
		case "-as":
			// 开启自动匹配并跳过确认环节
			global.AutoCompare = true
			global.SkipConfirm = true
			break
		case "-f":
			global.VersionFromFile = true
			break
		default:
			// 加入修订号
			versions = append(versions, arg)
		}
	}

	// 处理Git修订号
	return handleGitVersions(versions)
}

func handleGitVersions(versions []string) []GitVersionStruct {
	// 如果是从文件中读取Git修订号，则清空 versions，并从指定文件中读取
	if global.VersionFromFile {
		versions = []string{}
		log.Println("从 gitVersions.txt 文件中读取需要抽取的补丁修订号")
		vFile, err := os.Open("./gitVersions.txt")
		if err != nil {
			panic(fmt.Errorf("读取 gitVersions.txt 文件异常 %v", err))
		}

		defer vFile.Close()

		scanner := bufio.NewScanner(vFile)
		for scanner.Scan() {
			line := scanner.Text()
			// 读取文件中的每一行作为修订号，以 # 开头的不计入
			if len(strings.TrimSpace(line)) > 0 && string(line[0]) != "#" {
				// 每行的内容再通过空格分隔
				re := regexp.MustCompile(`\s+`)
				split := re.Split(line, -1)
				for _, gv := range split {
					versions = append(versions, gv)
				}

			}
		}
	}

	if len(versions) <= 0 {
		panic("修订号为空")
	}

	log.Printf("待处理修订号共计 %d 个,versions: %v\n", len(versions), versions)

	// 组装对象
	var gitVersions []GitVersionStruct

	// 开协程
	wg := sync.WaitGroup{}

	for _, version := range versions {
		gitVersion := GitVersionStruct{
			GitVersion: version,
		}

		wg.Add(1)

		go func() {

			defer func() {
				wg.Done()
			}()

			err := gitVersion.HandleGitVersion()
			if err != nil {
				// panic(fmt.Errorf("处理修订号%s出错,err:%v\n", gitVersion.GitVersion, err))
				global.AppendMsg(global.ERROR, fmt.Sprintf("处理修订号[%s]出错,err:%v", gitVersion.GitVersion, err))
			} else {
				gitVersions = append(gitVersions, gitVersion)
			}

		}()
	}

	wg.Wait()

	return gitVersions
}
